/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package fr.afcepf.projet2.metiers.webservices.catalogue;



import fr.afcepf.projet2.metiers.donnees.assembleur.catalogue.CategorieAssembleur;
import fr.afcepf.projet2.metiers.donnees.assembleur.catalogue.ProduitAssembleur;
import fr.afcepf.projet2.metiers.donnees.dao.interfaces.catalogue.IDaoCategorie;
import fr.afcepf.projet2.metiers.donnees.dao.interfaces.catalogue.IDaoProduit;
import fr.afcepf.projet2.metiers.donnees.dto.catalogue.CategorieDto;
import fr.afcepf.projet2.metiers.donnees.dto.catalogue.ProduitDto;
import fr.afcepf.projet2.metiers.donnees.entites.catalogue.Categorie;
import fr.afcepf.projet2.metiers.donnees.entites.catalogue.Produit;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.ejb.Singleton;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

/**
 * Implémentation du WebService gérant le catalogue produits
 *
 * @author monaamer
 */
@WebService(serviceName = "WsCatalogue")
@Singleton()
public class WsCatalogue {
    @EJB
    private IDaoProduit iDaoProduit;
    @EJB
    private IDaoCategorie iDaoCategorie;
    //private Integer site;

    /**
     *
     * @return
     */
    @WebMethod(operationName = "listCategories")
    public List<CategorieDto> listCategories(@WebParam(name ="site") final String site) 
           {
        Map<String, String> args = new HashMap<>();
        args.put("site", site);
       List<Categorie> listeCategorie = iDaoCategorie
                    .rechercherParNamedQueryEtArguments("Categorie.findBySite", args);
        return CategorieAssembleur.creationListeCategorieDto(listeCategorie);
    }

    /**
     * Cette méthode renvoie une ou plusieurs catégories par leur nom
     * @param nom
     * @return
     */
    @WebMethod(operationName = "getCategorieByNom")
    public CategorieDto getCategorieByNom(
            @WebParam (name = "categorie") final String nomCategorie){
        Map<String, String> args = new HashMap<>();
        args.put("categorie", nomCategorie);
         List<Categorie> categories = 
                 iDaoCategorie.
                 rechercherParNamedQueryEtArguments("Categorie.findByCategorie", args);

        return CategorieAssembleur.creationCategorieDto(categories.get(0));
    }
    
       @WebMethod(operationName = "getCategorieById")
    public CategorieDto getCategorieById(
            @WebParam (name = "id")final int idCategorie) {  
        Categorie categorie = 
                iDaoCategorie.obtenirParId(idCategorie);
        return CategorieAssembleur.creationCategorieDto(categorie);
       }

    /**
     *
     * @param nom
     * @return
     */
    @WebMethod(operationName = "getProduitsByNom")
    public List<ProduitDto> getProduitsByNom(
            @WebParam (name = "titreProduit") final String titreProduit) 
            {
        Map<String, String> args = new HashMap<>();
        args.put("titreProduit", titreProduit);
          List<Produit>   produits =
                  iDaoProduit
                  .rechercherParNamedQueryEtArguments("Produit.findByNom", args);

        return ProduitAssembleur.creationListeProduitDto(produits);
    }

    /**
     *
     * @param idProduit
     * @return
     */
    @WebMethod(operationName = "getProduitsById")
    public ProduitDto getProduitsById(
            @WebParam (name ="id")final int idProduit) {
         Produit produit = iDaoProduit.obtenirParId(idProduit);
        return ProduitAssembleur.creationProduitDto(produit);
    }

    /**
     *
     * @param categorie
     * @return
     */
    @WebMethod(operationName = "getProduitsByCategorie")
    public List<ProduitDto> getProduitsByCategorie(
            @WebParam (name="categorie")final CategorieDto categorie) 
             {
        Map<String, Categorie> args = new HashMap<>();
        args.put("categorie",
                CategorieAssembleur.updateCategorie(categorie));
            List<Produit> listeProd = iDaoProduit
                    .rechercherParNamedQueryEtArguments("Produit.findByCategorie", args);
        return ProduitAssembleur.creationListeProduitDto(listeProd);
    }

    /**
     *
     * @param produit
     */
    @WebMethod (operationName="updateStocks")
    public void updateStocks(
            @WebParam (name="produit")final ProduitDto produit) {
        ProduitAssembleur.updateProduit(produit);
    }
}
